# -*- coding: utf-8 -*-
# 如果你的程序（包括注释）中包含中文，请加上上面这一行，用于指明编码（utf-8）。
# #号开头的行都是注释。

# 如何编辑本程序：
#     用任何文本编辑器均可编辑。

# 如何运行本程序：
#     在终端中，运行：python p903_3d.py
#
# 依赖模块：
#     matplotlib  (pip install matplotlib)
#     numpy       (pip install numpy)
#

# 一般的绘图只需调用pyplot子模块。
import matplotlib.pyplot as plt
import numpy as np

# mpl_toolkits是matplotlib自带的工具包，包括了3维绘图函数。
from mpl_toolkits.mplot3d import Axes3D


# 设置绘图模块的参数使之能正确显示中文（标题、图例中的中文）
plt.rcParams['font.sans-serif'] = ['FangSong']
plt.rcParams['axes.unicode_minus'] = False

#--------------------------------------------------------------
# 等高线图

delta = 0.025

# 生成代表X轴数据的列表
x = np.arange(-3.0, 3.0, delta)
# 生成代表Y轴数据的列表
y = np.arange(-2.0, 2.0, delta)
# 对x、y数据进行网格化
X, Y = np.meshgrid(x,y)

# 计算Z轴数据（高度数据）
Z = (np.exp(-X**2 - Y**2) - np.exp(-(X-1)**2 - (Y-1)**2)) * 2

# 为等高线图填充颜色，
plt.contourf(X, Y, Z,  # 3维数据
    16,  # 将等高线分为16部分
    alpha=0.75, 
    cmap='rainbow')  # 使用颜色映射来区分不同高度的区域
# cmap: rainbow, hot, gray 等
    
# 绘制等高线
C = plt.contour(X, Y, Z, 16,  # 需与上面contourf的前4个参数一致
    colors = 'black',  # 指定等高线的颜色
    linewidths = 0.5)  # 指定等高线的宽度

# 绘制等高线的数值
plt.clabel(C, inline=True, fontsize=10)

# 去除坐标轴
plt.xticks([])
plt.yticks([])

plt.title('等高线图')
plt.xlabel('纬度')
plt.ylabel('经度')
plt.show()


#--------------------------------------------------------------
# 3D图形

fig = plt.figure(figsize=(12,8))
ax = Axes3D(fig)

delta = 0.125
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x,y)
Z = (np.exp(-X**2 - Y**2) - np.exp(-(X-1)**2 - (Y-1)**2)) * 2

# 绘制3D图形
ax.plot_surface(X, Y, Z,  # 3维数据
    rstride=1,  # 指定行的跨度
    cstride=1,  # 指定列的跨度
    cmap=plt.get_cmap('rainbow'))  # 设置颜色映射

# 设置Z轴范围
ax.set_zlim(-2, 2)

plt.title('3D图形')
plt.show()


    





